﻿/**
 * @file   FITKAbaqusAdaptorInteractionPropertySurfaceContact.h
 * @brief 相互作用属性-接触属性读写
 * @author liuzhonghua (liuzhonghuaszch@163.com)
 * @date 2024-06-20
 */
#ifndef __FITKABAQUSADAPTORINTERACTIONPROPERTYSURFACECONTACT__H__
#define __FITKABAQUSADAPTORINTERACTIONPROPERTYSURFACECONTACT__H__

#include "FITKAbaqusAbstractAdaptor.h"
#include "FITK_Kernel/FITKAdaptor/FITKIOAdaptorFactory.h"

 //前置声明
ForwardDeclarNS(AbaqusData, FITKDataCase)
ForwardDeclarNS(Interface, FITKAbaInteractionPropertyContact)
ForwardDeclarNS(Interface, FITKAbaInteractionContactBehavior)
ForwardDeclarNS(Interface, FITKAbaInteractionContactTangentialBehavior)
ForwardDeclarNS(Interface, FITKAbaInteractionContactNormalBehavior)
ForwardDeclarNS(Interface, FITKAbaAbstractInteractionProperty)

namespace IO
{
    /**
     * @brief Abaqus 相互作用属性-接触属性-切向行为 读写适配器
     * @author liuzhonghua (liuzhonghuaszch@163.com)
     * @date 2024-03-26
     */
    class FITKAbaqusAdaptorInteractionContactTangentialBehavior : public FITKAbaqusAbstractAdaptor
    {
    public:
        explicit FITKAbaqusAdaptorInteractionContactTangentialBehavior() = default;
        ~FITKAbaqusAdaptorInteractionContactTangentialBehavior() = default;

        /**
         * @brief 获取适配器数据类型名
         * @return 适配器数据类型名
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-03-26
         */
        QString getAdaptorClass() override;

        /**
         * @brief 设置显式类型与隐式类型
         * @param[i] isexplicit 显式类型
         * @param[i] isstandard 隐式类型
         * @author liuzhonghua (liuzhonghuaszch@163.com)
         * @date 2024-06-20
         */
        void setExplicitStandard(int isexplicit, int isstandard);

        /**
         * @brief 适配器读取
         * @return 状态 true成功， false失败
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-03-26
         */
        bool adaptR() override;

        /**
         * @brief 适配器写出
         * @return 状态 true成功， false失败
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-03-26
         */
        bool adaptW() override;

    private:

        /**
         * @brief 读取接触的切向行为里的罚类型
         * @return 状态 true成功， false失败
         * @author liuzhonghua (liuzhonghuaszch@163.com)
         * @date 2024-04-23
         */
        bool readContactTangentialBehaviorToPenalty();
        /**
         * @brief 写出接触的切向行为无摩擦属性
         * @return
         * @author liuzhonghua (liuzhonghuaszch@163.com)
         * @date 2024-06-20
         */
        bool writeContactTangentialBehaviorToFrictionless();
        /**
         * @brief 写出接触的切向行为里的罚类型
         * @return 状态 true成功， false失败
         * @author liuzhonghua (liuzhonghuaszch@163.com)
         * @date 2024-04-23
         */
        bool writeContactTangentialBehaviorToPenalty();

    private:
        /**
         * @brief 相互作用接触属性数据
         * @author liuzhonghua (liuzhonghuaszch@163.com)
         * @date 2024-06-20
         */
        Interface::FITKAbaInteractionPropertyContact* _iteractionPropContact{};
        /**
         * @brief 场边量个数
         * @author liuzhonghua (liuzhonghuaszch@163.com)
         * @date 2024-06-20
         */
        int _dependencies{ 0 };
        /**
         * @brief 用于记录分析步是否是显式类型
         * @author liuzhonghua (liuzhonghuaszch@163.com)
         * @date 2024-04-23
         */
        bool _isExplicit{ false };
        /**
         * @brief 用于记录分析步是否是隐式类型
         * @author liuzhonghua (liuzhonghuaszch@163.com)
         * @date 2024-04-23
         */
        bool _isStandard{ false };
    };
    Register2FITKIOAdaptorFactory(INP, Interface::FITKAbaInteractionContactTangentialBehavior, FITKAbaqusAdaptorInteractionContactTangentialBehavior);
}

namespace IO
{
    /**
     * @brief Abaqus 相互作用属性-接触属性-法向行为 读写适配器
     * @author liuzhonghua (liuzhonghuaszch@163.com)
     * @date 2024-03-26
     */
    class FITKAbaqusAdaptorInteractionContactNormalBehavior : public FITKAbaqusAbstractAdaptor
    {
    public:
        /**
         * @brief 获取适配器数据类型名
         * @return 适配器数据类型名
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-03-26
         */
        QString getAdaptorClass() override;

        /**
         * @brief 设置显式类型与隐式类型
         * @param[i] isexplicit 显式类型
         * @param[i] isstandard 隐式类型
         * @author liuzhonghua (liuzhonghuaszch@163.com)
         * @date 2024-06-20
         */
        void setExplicitStandard(int isexplicit, int isstandard);

        /**
         * @brief 适配器读取
         * @return 状态 true成功， false失败
         * @author liuzhonghua (liuzhonghuaszch@163.com)
         * @date 2024-03-26
         */
        bool adaptR() override;

        /**
         * @brief 适配器写出
         * @return 状态 true成功， false失败
         * @author liuzhonghua (liuzhonghuaszch@163.com)
         * @date 2024-03-26
         */
        bool adaptW() override;

    private:
        /**
         * @brief 读取接触的法向行为过盈类型的"硬"接触类型
         * @return
         * @author liuzhonghua (liuzhonghuaszch@163.com)
         * @date 2024-06-20
         */
        bool readContactNormalBehaviorToHardContact();
        /**
         * @brief 读取接触的法向行为过盈类型的指数类型
         * @return
         * @author liuzhonghua (liuzhonghuaszch@163.com)
         * @date 2024-06-20
         */
        bool readContactNormalBehaviorToExponential();
        /**
         * @brief 读取接触的法向行为过盈类型的线性类型
         * @return
         * @author liuzhonghua (liuzhonghuaszch@163.com)
         * @date 2024-06-20
         */
        bool readContactNormalBehaviorToLinear();
        /**
         * @brief 读取接触的法向行为过盈类型的表类型
         * @return
         * @author liuzhonghua (liuzhonghuaszch@163.com)
         * @date 2024-06-20
         */
        bool readContactNormalBehaviorToTabular();
        /**
         * @brief 读取接触的法向行为过盈类型的标量因子 Explicit类型
         * @return
         * @author liuzhonghua (liuzhonghuaszch@163.com)
         * @date 2024-06-20
         */
        bool readContactNormalBehaviorToScaleFactor_GeneralContactExplicit();
        /**
         * @brief 写出接触的法向行为过盈类型的"硬"接触类型
         * @return
         * @author liuzhonghua (liuzhonghuaszch@163.com)
         * @date 2024-06-20
         */
        bool writeContactNormalBehaviorToHardContact();
        /**
         * @brief 写出接触的法向行为过盈类型的指数类型
         * @return
         * @author liuzhonghua (liuzhonghuaszch@163.com)
         * @date 2024-06-20
         */
        bool writeContactNormalBehaviorToExponential();
        /**
         * @brief 写出接触的法向行为过盈类型的线性类型
         * @return
         * @author liuzhonghua (liuzhonghuaszch@163.com)
         * @date 2024-06-20
         */
        bool writeContactNormalBehaviorToLinear();
        /**
         * @brief 写出接触的法向行为过盈类型的表类型
         * @return
         * @author liuzhonghua (liuzhonghuaszch@163.com)
         * @date 2024-06-20
         */
        bool writeContactNormalBehaviorToTabular();
        /**
         * @brief 写出接触的法向行为过盈类型的标量因子 Explicit类型
         * @return
         * @author liuzhonghua (liuzhonghuaszch@163.com)
         * @date 2024-06-20
         */
        bool writeContactNormalBehaviorToScaleFactor_GeneralContactExplicit();


    private:
        /**
         * @brief 相互作用接触属性数据
         * @author liuzhonghua (liuzhonghuaszch@163.com)
         * @date 2024-06-20
         */
        Interface::FITKAbaInteractionPropertyContact* _iteractionPropContact{};
        /**
         * @brief 场边量个数
         * @author liuzhonghua (liuzhonghuaszch@163.com)
         * @date 2024-06-20
         */
        int _dependencies{ 0 };
        /**
         * @brief 用于记录分析步是否是显式类型
         * @author liuzhonghua (liuzhonghuaszch@163.com)
         * @date 2024-04-23
         */
        bool _isExplicit{ false };
        /**
         * @brief 用于记录分析步是否是隐式类型
         * @author liuzhonghua (liuzhonghuaszch@163.com)
         * @date 2024-04-23
         */
        bool _isStandard{ false };
    };
    Register2FITKIOAdaptorFactory(INP, Interface::FITKAbaInteractionContactNormalBehavior, FITKAbaqusAdaptorInteractionContactNormalBehavior);
}

namespace IO
{
    /**
     * @brief Abaqus 相互作用属性-接触属性 读写适配器
     * @author liuzhonghua (liuzhonghuaszch@163.com)
     * @date 2024-03-26
     */
    class FITKAbaqusAdaptorInteractionPropertySurfaceContact : public FITKAbaqusAbstractAdaptor
    {
    public:
        explicit FITKAbaqusAdaptorInteractionPropertySurfaceContact() = default;
        ~FITKAbaqusAdaptorInteractionPropertySurfaceContact() = default;

        /**
         * @brief 获取适配器数据类型名
         * @return 适配器数据类型名
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-03-26
         */
        QString getAdaptorClass() override;

        /**
         * @brief 设置算例数据对象
         * @param caseData
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-03-26
         */
        void setCaseData(AbaqusData::FITKDataCase* caseData);

        /**
         * @brief 适配器读取
         * @return 状态 true成功， false失败
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-03-26
         */
        bool adaptR() override;

        /**
         * @brief 适配器写出
         * @return 状态 true成功， false失败
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-03-26
         */
        bool adaptW() override;

    private:
        /**
         * @brief 读取接触的几何属性行为
         * @return 状态 true成功， false失败
         * @author liuzhonghua (liuzhonghuaszch@163.com)
         * @date 2024-06-20
         */
        bool readContactGeometricProperty();
        /**
         * @brief 读取接触的切向行为
         * @return 状态 true成功， false失败
         * @author liuzhonghua (liuzhonghuaszch@163.com)
         * @date 2024-04-19
         */
        bool readContactTangentialBehavior();
        /**
         * @brief 读取接触的法向行为
         * @return 状态 true成功， false失败
         * @author liuzhonghua (liuzhonghuaszch@163.com)
         * @date 2024-04-19
         */
        bool readContactNormalBehavior();
        /**
         * @brief 读取接触的热传导
         * @return 状态 true成功， false失败
         * @author liuzhonghua (liuzhonghuaszch@163.com)
         * @date 2024-04-19
         */
        bool readContactThermalConduction();
        /**
         * @brief 写出接触的几何属性行为和面接触属性关键字
         * @return 状态 true成功， false失败
         * @author liuzhonghua (liuzhonghuaszch@163.com)
         * @date 2024-06-20
         */
        bool writeContactGeometricProperty();
        /**
         * @brief 写出接触的切向行为
         * @return 状态 true成功， false失败
         * @author liuzhonghua (liuzhonghuaszch@163.com)
         * @date 2024-04-19
         */
        bool writeContactTangentialBehavior();
        /**
         * @brief 写出接触的法向行为
         * @return 状态 true成功， false失败
         * @author liuzhonghua (liuzhonghuaszch@163.com)
         * @date 2024-04-19
         */
        bool writeContactNormalBehavior();
        /**
         * @brief 写出接触的热传导
         * @return 状态 true成功， false失败
         * @author liuzhonghua (liuzhonghuaszch@163.com)
         * @date 2024-04-19
         */
        bool writeContactThermalConduction();

    private:

        /**
         * @brief 算例数据
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-04-13
         */
        AbaqusData::FITKDataCase* _caseData{};
        /**
         * @brief 相互作用接触属性数据
         * @author liuzhonghua (liuzhonghuaszch@163.com)
         * @date 2024-06-20
         */
        Interface::FITKAbaInteractionPropertyContact* _iteractionPropContact{};
        /**
         * @brief 用于记录分析步是否是显式类型
         * @author liuzhonghua (liuzhonghuaszch@163.com)
         * @date 2024-04-23
         */
        bool _isExplicit{ false };
        /**
         * @brief 用于记录分析步是否是隐式类型
         * @author liuzhonghua (liuzhonghuaszch@163.com)
         * @date 2024-04-23
         */
        bool _isStandard{ false };
    };

    Register2FITKIOAdaptorFactory(INP, Interface::FITKAbaAbstractInteractionProperty, FITKAbaqusAdaptorInteractionPropertySurfaceContact);
}



#endif